package org.net5ijy.commons.http;

import java.io.Closeable;
import java.io.File;
import java.util.Map;
import org.net5ijy.commons.http.response.FileResponseHolder;
import org.net5ijy.commons.http.response.HtmlResponseHolder;

/**
 * Http接口
 *
 * @author xuguofeng
 * @date 2020/7/14 8:45
 */
public interface Http extends Closeable {

  int KB = 1024;

  int MB = 1024 * 1024;

  int GB = 1024 * 1024 * 1024;

  int MS10 = 10;

  int MS100 = 100;

  int S1 = 1000;

  int M1 = 1000 * 60;

  int H1 = 1000 * 60 * 60;

  /**
   * 处理没有请求参数的GET请求
   *
   * @param url 请求地址，后面可以有?arg1=val1&arg2=val2这样的参数
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doGet(String url);

  /**
   * 处理没有请求参数的GET请求
   *
   * @param url 请求地址，后面可以有?arg1=val1&arg2=val2这样的参数
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doGetWithHeaders(String url, Map<String, String> headers);

  /**
   * 处理含有请求参数的GET请求
   *
   * @param url 请求地址，后面可以有?arg1=val1&arg2=val2这样的参数
   * @param params 封装请求参数
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doGet(String url, Map<String, String> params);

  /**
   * 处理含有请求参数的GET请求
   *
   * @param url 请求地址，后面可以有?arg1=val1&arg2=val2这样的参数
   * @param params 封装请求参数
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doGet(String url, Map<String, String> params, Map<String, String> headers);

  /**
   * 使用POST方式发送JSON数据
   *
   * @param url 请求地址
   * @param json json字符串
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostJson(String url, String json);

  /**
   * 使用POST方式发送JSON数据
   *
   * @param url 请求地址
   * @param json json字符串
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostJson(String url, String json, Map<String, String> headers);

  /**
   * 使用POST方式发送JSON数据
   *
   * @param url 请求地址
   * @param jsonAble 可以转为JSON字符串的Object对象
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostJson(String url, Object jsonAble);

  /**
   * 使用POST方式发送JSON数据
   *
   * @param url 请求地址
   * @param jsonAble 可以转为JSON字符串的Object对象
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostJson(String url, Object jsonAble, Map<String, String> headers);

  /**
   * 使用POST方式发送XML数据
   *
   * @param url 请求地址
   * @param xml xml字符串
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostXml(String url, String xml);

  /**
   * 使用POST方式发送XML数据
   *
   * @param url 请求地址
   * @param xml xml字符串
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostXml(String url, String xml, Map<String, String> headers);

  /**
   * 使用POST方式发送XML数据
   *
   * @param url 请求地址
   * @param xml 封装xml数据
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostXml(String url, Map<String, String> xml);

  /**
   * 使用POST方式发送XML数据
   *
   * @param url 请求地址
   * @param xml 封装xml数据
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostXml(String url, Map<String, String> xml, Map<String, String> headers);

  /**
   * 发送一个POST请求到指定url
   *
   * @param url 请求地址，后面可以有?arg1=val1&arg2=val2这样的参数
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPost(String url);

  /**
   * 发送一个POST请求到指定url
   *
   * @param url 请求地址，后面可以有?arg1=val1&arg2=val2这样的参数
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPost(String url, Map<String, String> headers);

  /**
   * 发送一个POST请求到指定url
   *
   * @param url 请求地址
   * @param params 封装请求参数
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostForm(String url, Map<String, String> params);

  /**
   * 发送一个POST请求到指定url
   *
   * @param url 请求地址
   * @param params 封装请求参数
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostForm(String url, Map<String, String> params, Map<String, String> headers);

  /**
   * 发送一个POST请求到指定url
   *
   * @param url 请求地址
   * @param params 普通类型参数
   * @param file 文件
   * @param name 文件域name值
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostFormWithFile(String url, Map<String, String> params, File file, String name);

  /**
   * 发送一个POST请求到指定url
   *
   * @param url 请求地址
   * @param params 普通类型参数
   * @param file 文件
   * @param name 文件域name值
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String doPostFormWithFile(
      String url, Map<String, String> params, File file, String name, Map<String, String> headers);

  /**
   * 上传文件到指定url
   *
   * @param url 请求地址
   * @param path 文件路径
   * @param name 文件在form中的name值
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String upload(String url, String path, String name);

  /**
   * 上传文件到指定url
   *
   * @param url 请求地址
   * @param path 文件路径
   * @param name 文件在form中的name值
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String upload(String url, String path, String name, Map<String, String> headers);

  /**
   * 上传文件到指定url
   *
   * @param url 请求地址
   * @param file 文件对象
   * @param name 文件在form中的name值
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String upload(String url, File file, String name);

  /**
   * 上传文件到指定url
   *
   * @param url 请求地址
   * @param file 文件对象
   * @param name 文件在form中的name值
   * @param headers 请求头
   * @return 响应字符串
   * @author xuguofeng
   * @date 2020/7/14
   */
  String upload(String url, File file, String name, Map<String, String> headers);

  /**
   * 使用get方式下载文件
   *
   * @param url 请求地址
   * @param filePath 文件保存路径
   * @param headers 请求头
   * @param params 请求参数
   * @return 响应
   * @author xuguofeng
   * @date 2020/7/14
   */
  FileResponseHolder download(
      String url, String filePath, Map<String, String> headers, Map<String, String> params);

  /**
   * 使用get方式下载文件，支持断点续传
   *
   * @param url 请求地址
   * @param filePath 文件保存路径
   * @param headers 请求头
   * @param params 请求参数
   * @param append 追加，即断点续传
   * @return 响应
   * @author xuguofeng
   * @date 2020/7/14
   */
  FileResponseHolder download(
      String url, String filePath, Map<String, String> headers, Map<String, String> params,
      boolean append);

  /**
   * 使用get方式获取网页
   *
   * @param url 请求地址
   * @param headers 请求头
   * @param params 请求参数
   * @return 响应
   * @author xuguofeng
   * @date 2020/7/14
   */
  HtmlResponseHolder html(String url, Map<String, String> headers, Map<String, String> params);

  /**
   * 使用post方式获取网页，可以用于提交表单
   *
   * @param url 请求地址
   * @param headers 请求头
   * @param params 请求参数
   * @return 响应
   * @author xuguofeng
   * @date 2020/7/14
   */
  HtmlResponseHolder postHtml(String url, Map<String, String> headers, Map<String, String> params);

  /**
   * 使用delete方式删除数据
   *
   * @param url 请求地址
   * @param headers 请求头
   * @return 响应
   * @author xuguofeng
   * @date 2020/12/30
   */
  String delete(String url, Map<String, String> headers);
}
